package com.and9.mchen.mcmusic.dao;

import java.util.List;

import com.and9.mchen.mcmusic.entity.Song;
import com.and9.mchen.mcmusic.exception.DaoException;

/**
 * 
 * @author MC
 * @version 1.0
 */
public interface ISongDao extends IBaseEntityDao{
	
	String[] BASEPROPERTYNAMES={"songName", "songLength", 
		"songSize", "songUrl", "issueTime"};
	
	int NEW_RECOMMEND_SONG_PAGE_COUNT=20;
	
	/**
	 * <p>
	 * 如果song对象为null<br/>
	 * 则返回-1
	 * </p>
	 * <p>
	 * 保存对象到数据库的时候，song的id为null或者0即可<br/>
	 * 保存对象时，propertyNames只要传null即可<br/>
	 * </p>
	 * <p>
	 * 更新对象的时候，不准更新song父类的属性<br/>
	 * 如果存在父类属性，则会修改propertyNames属性为song属性
	 * </p>
	 * @param song
	 * @param propertyNames
	 * @return 
	 * 返回创建或者更新<tt>song</tt>的成功次数
	 * @throws DaoException
	 */
	int createOrUpdateSong(Song song, String... propertyNames) throws DaoException;
	
	/**
	 * <p>
	 * song对象不能为null song的集合muicStyles也不能为null<br/>
	 * 如果song、 muicStyles里的各个id <= 0 或 null 且 uniqueId不合法<br/>
	 * 返回  null
	 * </p>
	 * @param song
	 * @return
	 * 返回<tt/>song</tt>与每个muicStyles创建关系成功的次数
	 * @throws DaoException
	 */
	int[] createSongMusicStyleRelevanceBySong(Song song) throws DaoException;
	
	/**
	 * <p>
	 * song对象不能为null song的statistics也不能为null<br/>
	 * 如果song、 statistics里的各个id <= 0 且 uniqueId不合法<br/>
	 * 返回  null
	 * </p>
	 * @param song
	 * @return 
	 * 返回<tt/>song</tt>与statistics创建关系成功的次数
	 * @throws DaoException
	 */
	int createSongStatisticsRelevanceBySong(Song song) throws DaoException;
	
	/**
	 * <p>
	 * 如果id <= 0</br>
	 * 则返回-1
	 * </p>
	 * @param id
	 * @return 
	 * 返回根据song的<tt>id</tt>删除song的成功次数
	 * @throws DaoException
	 */
	int deleteSongBySongId(long id) throws DaoException;
	
	/**
	 * <p>
	 * 返回数据库的song的总个数
	 * </p>
	 * @return
	 * @throws DaoException
	 */
	long getAllSongsCount() throws DaoException;
	
	/**
	 * <p>
	 * 如果id <= 0<br/>
	 * 则返回null
	 * </p>
	 * @param id
	 * @return 
	 * 根据song的<tt>id</tt>查找song<br/>
	 * 查找失败返回null
	 * @throws DaoException
	 */
	Song getSongBySongId(long id) throws DaoException;
	
	/**
	 * <p>
	 * 如果uniqueId 是 null<br/>
	 * 则返回null
	 * </p>
	 * @param uniqueId
	 * @return
	 * 根据song的<tt>uniqueId</tt>查找song<br/>
	 * 查找失败返回null
	 * @throws DaoException
	 */
	Song getSongBySongUniqueId(String uniqueId) throws DaoException;
	
	/**
	 * <p>
	 * 根据album的<tt>id</tt>和页数<tt>pageNum</tt>、每页显示的个数<tt>pageCount</tt>、排序返回<tt>orderBy</tt><br/>
	 * 返回songs
	 * </p>
	 * @param id
	 * @param pageNum
	 * @param pageCount
	 * @param orderBy
	 * @return 
	 * 返回songs
	 * @throws DaoException
	 */
	List<Song> getSongsByAlbumId(long id, int pageNum, int pageCount, String orderBy) throws DaoException;
	
	/**
	 * <p>
	 * 根据musicStyle的<tt>id</tt>和页数<tt>pageNum</tt>、每页显示的个数<tt>pageCount</tt>、排序返回<tt>orderBy</tt><br/>
	 * 返回songs
	 * </p> 
	 * @param id
	 * @param pageNum
	 * @param pageCount
	 * @param orderBy
	 * @return
	 * 返回songs
	 * @throws DaoException
	 */
	List<Song> getSongsByMusicStyleId(long id, int pageNum, int pageCount, String orderBy) throws DaoException;
	
	/**
	 * <p>
	 * 根据singer的<tt>id</tt>和页数<tt>pageNum</tt>、每页显示的个数<tt>pageCount</tt>、排序返回<tt>orderBy</tt><br/>
	 * 返回songs
	 * </p> 
	 * @param id
	 * @param pageNum
	 * @param pageCount
	 * @param orderBy
	 * @return
	 * 返回songs
	 * @throws DaoException
	 */
	List<Song> getSongsBySingerId(long id, int pageNum, int pageCount, String orderBy) throws DaoException;
	
	/**
	 * <p>
	 * 根据ablum<tt>id</tt>返回数据库的song的总个数
	 * </p>
	 * @param id
	 * @return 
	 * 返回songs个数
	 * @throws DaoException
	 */
	long getSongsCountByAlbumId(long id) throws DaoException;
	
	/**
	 * <p>
	 * 根据musicStyle<tt>id</tt>返回数据库的song的总个数
	 * </p> 
	 * @param id
	 * @return
	 * 返回songs个数
	 * @throws DaoException
	 */
	long getSongsCountByMusicStyleId(long id) throws DaoException;
	
	/**
	 * <p>
	 * 根据singer<tt>id</tt>返回数据库的song的总个数
	 * </p>
	 * @param id
	 * @return
	 * 返回songs个数
	 * @throws DaoException
	 */
	long getSongsCountBySingerId(long id) throws DaoException;
	
	/**
	 * <p>
	 * song对象不能为null song的集合muicStyles也不能为null<br/>
	 * 如果song、 muicStyles里的各个id <= 0 且 uniqueId不合法<br/>
	 * 返回  null
	 * </p>
	 * @param song
	 * @return
	 * 返回<tt/>song</tt>与每个muicStyles删除关系成功的次数
	 * @throws DaoException
	 */
	int[] removeSongMusicStyleRelevanceBySong(Song song) throws DaoException;
	
	/**
	 * <p>
	 * song对象不能为null<br/>
	 * 如果song的各个id <= 0 且 uniqueId不合法<br/>
	 * 返回  null
	 * </p> 
	 * @param song
	 * @return 
	 * 返回<tt/>song</tt>与statistics删除关系成功的次数
	 * @throws DaoException
	 */
	int removeSongStatisticsRelevanceBySong(Song song) throws DaoException;
	
	/**
	 * 根据sql与条件参数来查找songs
	 * @param sql
	 * @param pageNum
	 * @param pageCount
	 * @param params
	 * @return
	 * 返回根据sql与条件参数来查找songs
	 * @throws DaoException
	 */
	List<Song> getSongs(String sql, int pageNum, int pageCount, Object... params) throws DaoException;
	
	/**
	 * <p>
	 * song对象不能为null<br/>
	 * 如果song的各个id <= 0 且 uniqueId不合法<br/>
	 * 返回  null
	 * </p> 
	 * @param song
	 * @return 
	 * 返回<tt/>song</tt>与lyric删除关系成功的次数
	 * @throws DaoException
	 */
	int createSongLyricRelevanceBySong(Song song) throws DaoException;
	
	/**
	 * <p>
	 * song对象不能为null<br/>
	 * 如果song的各个id <= 0 且 uniqueId不合法<br/>
	 * 返回  null
	 * </p> 
	 * @param song
	 * @return 
	 * 返回<tt/>song</tt>与lyric创建关系成功的次数
	 * @throws DaoException
	 */
	int removeSongLyricRelevanceBySong(Song song) throws DaoException;
	
}
